package com.idroid.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.util.Log;
import android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.idroid.utils.CacheTool.MD5Util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;


/**
 * 自定义的加载图片的工具类，类似于Xutils中的BitmapUtil，在实际使用中，一般使用BitmapUtil，为了理解三级缓存，
 * 这里模拟BitmapUtil自定义了CustomBitmapUtil
 *
 * @author ZHY
 */
public class CustomBitmapUtils {


    public CustomBitmapUtils() {
    }

    /**
     * 加载图片，将当前URL对应的图片显示到ivPic的控件上
     *
     * @param ivPic ImageView控件
     * @param url   图片的地址
     */
    public void display(ImageView ivPic, String url, Context context, File mFile) {

        String filename = null;
        try {
            filename = MD5Util.encode(url);
        } catch (Exception e) {
            e.printStackTrace();
        }

        File file = new File(mFile, filename);
        if (file.exists())
            Glide.with(context).load(file).into(ivPic);
        else Log.e("zhu", "图片资源不存在");

    }

    /**
     * 保存图片缓存
     *
     * @param url
     * @param context
     * @param mFile
     */
    public void display(String url, Context context, File mFile) {

        try {
            // 网络缓存�
            NetCacheUtils netCacheUtils = new NetCacheUtils();
            String filename = MD5Util.encode(url);
            File file = new File(mFile,filename);
            netCacheUtils.getBitmapFromNet(url, file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取SD卡中的图片文件
     * @param ctx
     * @param uri
     * @return
     */
    public Bitmap decodeUriAsBitmap(Context ctx,Uri uri) {
        Bitmap bitmap = null;
        try {
            // 先通过getContentResolver方法获得一个ContentResolver实例，
            // 调用openInputStream(Uri)方法获得uri关联的数据流stream
            // 把上一步获得的数据流解析成为bitmap
            bitmap = BitmapFactory.decodeStream(ctx.getContentResolver().openInputStream(uri));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        }
        return bitmap;
    }


    /**
     * 通过uri获取图片并进行压缩
     * 可自定义选择尺寸体积
     * @param ctx
     * @param uri
     * @param size 图片压缩后体积
     * @return
     * @throws IOException
     */
    public Bitmap getBitmapFormUri(Context ctx, Uri uri,int size) throws IOException {
        InputStream input = ctx.getContentResolver().openInputStream(uri);
        BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options();
        onlyBoundsOptions.inJustDecodeBounds = true;
        onlyBoundsOptions.inDither = true;//optional
        onlyBoundsOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;//optional
        BitmapFactory.decodeStream(input, null, onlyBoundsOptions);
        input.close();
        int originalWidth = onlyBoundsOptions.outWidth;
        int originalHeight = onlyBoundsOptions.outHeight;
        if ((originalWidth == -1) || (originalHeight == -1))
            return null;
        //图片分辨率以450x800为标准
        float ww = 800f;//这里设置宽度为800f
        float hh = 450f;//这里设置高度为450f
        //缩放比。由于是固定比例缩放，只用高或者宽其中一个数据进行计算即可
        int be = 1;//be=1表示不缩放
        if (originalWidth > originalHeight && originalWidth > ww) {//如果宽度大的话根据宽度固定大小缩放
            be = (int) (originalWidth / ww);
        } else if (originalWidth < originalHeight && originalHeight > hh) {//如果高度高的话根据宽度固定大小缩放
            be = (int) (originalHeight / hh);
        }
        if (be <= 0)
            be = 1;
        //比例压缩
        BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
        bitmapOptions.inSampleSize = be;//设置缩放比例
        bitmapOptions.inDither = true;//optional
        bitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;//optional
        input = ctx.getContentResolver().openInputStream(uri);
        Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions);
        input.close();
        return compressImage(bitmap,size);//再进行质量压缩
    }
    /**
     * 通过uri获取图片并进行压缩
     * 默认300K大小
     * @param uri
     */
    public Bitmap getBitmapFormUri(Context ctx, Uri uri) throws IOException {
        return getBitmapFormUri(ctx,uri,300);//再进行质量压缩
    }

    /**
     * 质量压缩方法
     * 可自定义体积
     * @param image
     * @param size 图片压缩后体积
     * @return
     */
    public Bitmap compressImage(Bitmap image,int size) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法，这里100表示不压缩，把压缩后的数据存放到baos中
        int options = 100;
        while (baos.toByteArray().length / 1024 > size) {  //循环判断如果压缩后图片是否大于300kb,大于继续压缩
            baos.reset();//重置baos即清空baos
            //第一个参数 ：图片格式 ，第二个参数： 图片质量，100为最高，0为最差  ，第三个参数：保存压缩后的数据的流
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%，把压缩后的数据存放到baos中
            options -= 10;//每次都减少10
        }
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
        return bitmap;
    }
}
